#include <stdio.h>
#include <string.h>

/**
 * "#define"是C语言中用来创建宏的预处理指令
 * 它的作用是将一个标识符或者关键字定义为一个常量 或者为一个代码片段(宏)定义一个名字 以便在后续的代码中使用
 * 这种预处理指令会在编译过程中进行简单的文本替换
 */
#define PI 3.14
#define PRAISE "you look beautiful!"
#define TEN = "0123456789"

/**
 * "#define"使用
 */
void preprocessing(void);

/**
 * 定义字符串
 */
void define_string(void);

/**
 * 从标准输入读取输入值
 */
void fun_scanf(void);

/**
 * sizeof
 * 如果统计字符串 将会统计/0
 * strlen
 * 去除/0结尾字符的长度
 */
void fun_sizeof_strlen();

/**
 * 只显示字符串, 并在结尾处自动添加'\0'
 */
void fun_puts();

// 只读常量
const int MONTH = 12;

int main(void)
{
    define_string();
    define_string();
    define_string();
    define_string();
    return 0;
}

void preprocessing(void)
{
    float radius;
    radius = 2.5F;
    // 此处的'PI'将会在编译前被预处理器替换为3.14
    float area = PI * radius * radius;
    printf("circle area = PI * radius^2 = %f * %f * %f = %f\n", PI, radius, radius, area);
}

void define_string(void)
{
    /*
     * 双引号括起来的内容为"字符串常量"
     * 编译器会自动在末尾添加'\0'
     * 属于静态存储类型 在整个程序生命周期内 都使用的同一块内存
     */
    char s[100] = "hello world";
    printf("s = [%s], location = [%p]\n", s, &s);


}

void fun_scanf(void)
{
    char name[40];

    printf("what's your name?\n");
    fflush(stdout);
    scanf("%s", name);
    printf("hello, %s. %s\n", name, PRAISE);
}

void fun_sizeof_strlen()
{
    char a = 'A';
    char string[] = "A";

    int size_char = sizeof(a);
    size_t st = sizeof(string);
    int size_string = sizeof(string);
    unsigned long long len_string = strlen(string);

    printf("char 'A' sizeof %d\n", size_char);
    printf("string \"A\" sizeof %d\n", size_string);
    printf("string \"A\" sizeof %llu\n", st);
    printf("string \"A\" strlen %llu", len_string);
}

void fun_puts()
{
    char words[80] = "i am a string in an array";
    char hello[80] = "hello" " world" "!";
    const char *pt1 = "something is pointing at me";

    puts("here are some strings");
    puts(PRAISE);
    puts(hello);
    puts(pt1);
    puts(words);
    words[8] = 'T';
    puts(words);
}
